4770
6525
Náhodou jsem spáchal nesprávné soubory na Git, ale ještě jsem nevytlačil potvrzení na server.
Jak mohu zrušit tyto závazky z místního úložiště? 
1
2
3
další
Vrátit zpět potvrzení a znovu
$ git commit -m "Něco strašně zavádějícího" # (0: Vaše nehoda)
$ git reset HEAD ~ # (1)
<< upravte soubory podle potřeby >> # (2)
$ git přidat. # (3)
$ git commit -c ORIG_HEAD # (4)
Tento příkaz je zodpovědný za vrácení zpět. Vrátí zpět vaše poslední potvrzení a ponechá váš pracovní strom (stav vašich souborů na disku) nedotčený. Budete je muset znovu přidat, než je budete moci znovu potvrdit).
Provádějte opravy souborů pracovního stromu.
git přidejte vše, co chcete zahrnout do svého nového odevzdání.
Potvrďte změny a znovu použijte starou zprávu o odevzdání. reset zkopíroval starou hlavu do .git / ORIG_HEAD; potvrzení s -c ORIG_HEAD otevře editor, který zpočátku obsahuje zprávu protokolu ze starého potvrzení a umožňuje ji upravit. Pokud zprávu nepotřebujete upravovat, můžete použít volbu -C.
Alternativně k úpravě předchozího potvrzení (nebo jen jeho zprávy o potvrzení), commit --amend přidá změny v aktuálním indexu k předchozímu potvrzení.
Chcete-li odebrat (nevrátit) potvrzení, které bylo odesláno na server, je nutné přepsat historii pomocí git push origin master --force.
Další čtení
Jak mohu přesunout HEAD zpět na předchozí místo? (Oddělená hlava) & Vrátit zpět
Výše uvedená odpověď vám ukáže git reflog, který můžete použít k určení SHA-1 pro potvrzení, ke kterému se chcete vrátit. Jakmile máte tuto hodnotu, použijte posloupnost příkazů, jak je vysvětleno výše.
HEAD ~ je stejný jako HEAD ~ 1. Článek What is the HEAD in git? je užitečné, pokud chcete zrušit více závazků.
|
Zrušení odevzdání je trochu děsivé, pokud nevíte, jak to funguje. Ale je to ve skutečnosti neuvěřitelně snadné, pokud tomu rozumíte. Ukážu vám 4 různé způsoby, jak můžete zrušit potvrzení.
možnost 1: git reset --hard
Řekněme, že to máte, kde C je vaše HLAVA a (F) je stav vašich souborů.
(F)
A-B-C
↑
mistr
Chcete nuke spáchat C a už to nikdy neuvidíte a ztratíte všechny změny v lokálně upravených souborech. Uděláte to:
git reset --hard HEAD ~ 1
Výsledek je:
(F)
A-B
↑
mistr
Nyní B je HLAVA. Protože jste použili --hard, obnoví se vaše soubory do stavu při potvrzení B.
možnost 2: reset git
Ah, ale předpokládejme, že spáchání C nebyla katastrofa, ale jen trochu pryč. Chcete zrušit potvrzení, ale ponechte si změny pro trochu úprav, než uděláte lepší potvrzení. Počínaje tímto odsud, s C jako HLAVA:
(F)
A-B-C
↑
mistr
Můžete to udělat tak, že vypnete --hard:
git reset HEAD ~ 1
V tomto případě je výsledek:
(F)
A-B-C
↑
mistr
V obou případech je HEAD pouze ukazatel na nejnovější potvrzení. Když provedete git reset HEAD ~ 1, řeknete Git, aby přesunul ukazatel HEAD zpět o jeden potvrzení. Ale (pokud nepoužíváte --hard) necháte soubory tak, jak byly. Takže nyní stav git ukazuje změny, které jste zkontrolovali do C. Neztratili jste nic!
možnost 3: git reset --soft
Nejlehčí dotek můžete dokonce vrátit zpět, ale ponechat soubory a index:
git reset --soft HEAD ~ 1
To nejenže ponechává vaše soubory samotné, ale dokonce i samotný index. Když uděláte git status, uvidíte, že v indexu jsou stejné soubory jako dříve. Ve skutečnosti můžete hned po tomto příkazu provést git commit a předělat stejný commit, jaký jste právě měli.
možnost 4: provedli jste git reset --hard a potřebujete tento kód získat zpět
Ještě jedna věc: Předpokládejme, že zničíte revizi jako v prvním příkladu, ale pak zjistíte, že jste ji nakonec potřebovali? Těžké štěstí, že?
Ne, stále existuje způsob, jak to získat zpět. Zadejte git reflog a uvidíte seznam (částečných) shas shasů (tj. Hashů), ve kterých jste se pohybovali. Najděte spáchaný příkaz, který jste zničili, a proveďte toto:
git checkout -b someNewBranchName shaYouDestroyed
Nyní jste ten vzkříšení vzkřísil. Závazky se ve skutečnosti na Gitu nezničí asi 90 dní, takže se obvykle můžete vrátit a zachránit ten, kterého jste se nechtěli zbavit.
|
Existují dva způsoby, jak „vrátit“ poslední potvrzení, v závislosti na tom, zda jste již svůj závazek zveřejnili (odeslali do vzdáleného úložiště):
Jak vrátit místní potvrzení
Řekněme, že jsem se zavázal místně, ale teď chci tento závazek odstranit.
git log
commit 101: bad commit # Poslední potvrzení. Toto by se nazývalo „HLAVA“.
commit 100: good commit # Druhý k poslednímu potvrzení. To je ten, který chceme.
Chcete-li obnovit vše zpět na způsob, jakým to bylo před posledním potvrzením, musíme resetovat na potvrzení před HEAD:
git reset --soft HEAD ^ # Použijte --soft, pokud chcete zachovat změny
git reset --hard HEAD ^ # Použijte --hard, pokud vám nezáleží na zachování provedených změn
Nyní git log ukáže, že náš poslední revize byla odstraněna.
Jak zrušit veřejné potvrzení
Pokud jste již své závazky zveřejnili, budete chtít vytvořit nový závazek, který „vrátí“ změny provedené v předchozím potvrzení (aktuální HEAD).
git revert HEAD
Vaše změny budou nyní vrácenya jste připraveni spáchat:
git commit -m 'obnovení souboru, který jsem omylem odstranil'
git log
spáchat 102: obnovení souboru, který jsem omylem odstranil
spáchat 101: odstranění souboru, který nepotřebujeme
spáchat 100: přidání souboru, který potřebujeme
Další informace najdete v Git Basics - Undoing Things.
|
Přidáním / odebráním souborů získáte věci tak, jak chcete:
git rm classdir
git přidejte zdroj
Poté upravte potvrzení:
git commit --amend
Předchozí chybné potvrzení bude upraveno tak, aby odráželo nový stav indexu - jinými slovy, bude to, jako byste nikdy neudělali chybu na prvním místě.
Mějte na paměti, že byste to měli dělat, pouze pokud jste ještě netlačili. Pokud jste tlačili, pak budete muset provést opravu normálně.
|
git rm yourfiles / *. třída
git commit -a -m "smazal všechny soubory třídy ve složce 'yourfiles'"
nebo
git reset --hard HEAD ~ 1
Varování: Výše ​​uvedený příkaz trvale odstraní úpravy souborů .java (a všech dalších souborů), které jste chtěli potvrdit.
Tvrdý reset na HEAD-1 nastaví vaši pracovní kopii do stavu odevzdání před chybným odevzdáním.
|
Chcete-li změnit poslední potvrzení
Nahraďte soubory v indexu:
git rm --cached * .class
git přidat * .java
Pokud je to soukromá pobočka, upravte potvrzení:
git commit --amend
Nebo pokud je to sdílená větev, proveďte nové potvrzení:
git commit -m 'Nahradit soubory .class soubory .java'
(Chcete-li změnit předchozí potvrzení, použijte úžasnou interaktivní rebase.)
ProTip ™: Přidejte * .class do gitignore a zastavte to znovu.
Chcete-li vrátit potvrzení
Úprava potvrzení je ideálním řešením, pokud potřebujete změnit poslední potvrzení, ale obecnější řešení se resetuje.
Git můžete resetovat na jakékoli potvrzení pomocí:
git reset @ ~ N
Kde N je počet potvrzení před HEAD a @ ~ se resetuje na předchozí potvrzení.
Takže místo změny potvrzení můžete použít:
git reset @ ~
git přidat * .java
git commit -m "Přidat soubory .java"
Podívejte se na resetování nápovědy git, konkrétně v částech --soft --mixed a --hard, abyste lépe pochopili, co to dělá.
Reflog
Pokud se pokazíte, můžete vždy použít reflog k nalezení zrušených závazků:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: reset: moving to @ ~
2c52489 HEAD @ {1}: commit: přidáno několik souborů .class
$ git reset 2c52489
... a jste zpátky tam, kde jste začali
|
Použijte git revert .
Chcete-li získat ID potvrzení, stačí použít git log.
|
Pokud plánujete úplně zrušit místní potvrzení, ať už provedete cokoli, co jste při provádění provedli, a pokud si s tím nebudete dělat starosti, udělejte následující příkaz.
git reset --hard HEAD ^ 1
(Tento příkaz bude ignorovat celé vaše potvrzení a vaše změny budou z místního pracovního stromu zcela ztraceny). Chcete-li vrátit své odevzdání, ale chcete své změny v pracovní oblasti (před odevzdáním stejně jako po přidání git), proveďte následující příkaz.
git reset --soft HEAD ^ 1
Nyní se vaše potvrzené soubory dostanou do pracovní oblasti. Předpokládejme, že chcete-li soubory vylepšit, protože potřebujete upravit nějaký nesprávný obsah, proveďte následující příkaz
git reset HEAD
Nyní potvrzené soubory pocházejí ze stupňovité oblasti do nestádiované oblasti. Nyní jsou soubory připraveny k úpravám, takže ať změníte cokoli, budete chtít úpravy upravit a přidat a provést nový / nový odevzdání.
Více (nefunkční odkaz) (archivovaná verze)
|
Pokud máte nainstalovaný Git Extras, můžete spustit git undo a vrátit tak poslední potvrzení. git undo 3 zruší poslední tři revize.
|
Chtěl jsem vrátit posledních pět revizí v našem sdíleném úložišti. Vyhledal jsem ID revize, ke kterému jsem se chtěl vrátit. Pak jsem zadal následující.
prompt> git reset --hard 5a7404742c85
HEAD je nyní na 5a74047 Přidána další stránka do katalogu
prompt> git push origin master --force
Celkem 0 (delta 0), znovu použito 0 (delta 0)
remote: bb / acl: neoneye je povoleno. přijaté užitečné zatížení.
Na adresu git@bitbucket.org: thecompany / prometheus.git
+ 09a6480 ... 5a74047 hlavní -> hlavní (vynucená aktualizace)
výzva>
|
Dávám přednost použití git rebase -i pro tuto práci, protože se objeví pěkný seznam, kde si mohu vybrat závazky, kterých se zbavím. Možná to nebude tak přímé jako u některých jiných odpovědí, ale je to prostě v pořádku.
Vyberte, kolik revizí chcete vypsat, a poté je vyvolejte takto (pro získání posledních tří)
git rebase -i HLAVA ~ 3
Ukázkový seznam
vyberte aa28ba7 Sanity check for RtmpSrv port
vyberte možnost verze c26c541 RtmpSrv
vybrat 58d6909 Lepší podpora dekódování URL
Poté Git odstraní závazky ze všech řádků, které odeberete.
|
Jak opravit předchozí místní potvrzení
Pomocí git-gui (nebo podobného) proveďte git commit --amend. Z grafického uživatelského rozhraní můžete přidat nebo odebrat jednotlivé soubory z potvrzení. Můžete také upravit zprávu o potvrzení.
Jak vrátit předchozí místní potvrzení
Stačí resetovat větev na předchozí umístění (například pomocí gitk nebo git rebase). Poté znovu uložte změny z uložené kopie. Po odvozu odpadu ve vašem místním úložišti to bude jako kdyby se nechtěné potvrzení nikdy nestalo. Chcete-li to udělat v jediném příkazu, použijte git reset HEAD ~ 1.
Slovovarování: Neopatrné použití git reset je dobrý způsob, jak dostat svou pracovní kopii do matoucího stavu. Doporučuji, aby se tomu začátečníci Gitu vyhýbali, pokud mohou.
Jak zrušit veřejné potvrzení
Chcete-li změny vrátit zpět, proveďte reverzní výběr třešní (git-revert).
Pokud jste do své pobočky dosud nestáhli další změny, můžete jednoduše udělat ...
git revert --no-edit HEAD
Poté posuňte aktualizovanou větev do sdíleného úložiště.
Historie revizí zobrazí obě revize zvlášť.
Pokročilé: Oprava soukromé pobočky ve veřejném úložišti
To může být nebezpečné - ujistěte se, že máte lokální kopii pobočky, kterou chcete přepsat.
Poznámka: Toto nechcete dělat, pokud na pobočce pracuje někdo jiný.
git push --delete (branch_name) ## odebrat veřejnou verzi větve
Vyčistěte svou pobočku lokálně a poté ji ...
git push origin (název_větve)
V normálním případě si pravděpodobně nemusíte dělat starosti s tím, že by historie historie vaší soukromé pobočky byla nedotčená. Stačí stisknout následné potvrzení (viz výše „Jak zrušit veřejné potvrzení“) a později skrýt historii hromadným sloučením.
|
Pokud to chcete trvale vrátit zpět a naklonovali jste nějaké úložiště
ID potvrzení lze zobrazit pomocí
git log
Pak můžete udělat -
git reset --hard 
git push origin  -f
|
Pokud jste se dopustili haraburdí, ale ne tlačili,
git reset --soft HEAD ~ 1
HEAD ~ 1 je zkratka pro potvrzení před hlavou. Alternativně se můžete podívat na SHA-1 hash, pokud se chcete resetovat. Možnost --soft odstraní potvrzení, ale ponechá všechny vaše změněné soubory „Změny, které mají být potvrzeny“, jak by to řekl stav git.
Chcete-li se zbavit jakýchkoli změn sledovaných souborů v pracovním stromu od potvrzení před hlavou, použijte místo toho „--hard“.
NEBO
Pokud jste již tlačili a někdo táhl, což je obvykle můj případ, nemůžete použít git reset. Můžete však udělat git revert,
git revert HEAD
Tím se vytvoří nový závazek, který obrátí vše, co bylo zavedeno náhodným spácháním.
|
Na SourceTree (GUI pro GitHub) můžete kliknout pravým tlačítkem na potvrzení a provést „reverzní potvrzení“. To by mělo vrátit zpět vaše změny.
Na terminálu:
Můžete také použít:
git vrátit
Nebo:
git reset --soft HEAD ^ # Použijte --soft, pokud chcete zachovat změny.
git reset --hard HEAD ^ # Použijte --hard, pokud vám nezáleží na zachování vašich změn.
|
Jediný příkaz:
git reset --soft 'HEAD ^'
Funguje skvěle k vrácení posledního místního potvrzení!
|
Stačí jej resetovat pomocí níže uvedeného příkazu pomocí git:
git reset --soft HEAD ~ 1
Vysvětlete: co git reset dělá, je to v podstatě resetováno na jakýkoli závazek, ke kterému se chcete vrátit, pak pokud to zkombinujete s klíčem --soft, vrátí se zpět, ale ponechte změny ve vašich souborech, takže vrátíte se do fáze, do které byl soubor právě přidán, HEAD je vedoucí pobočky a pokud zkombinujete s ~ 1 (v tomto případě použijete také HEAD ^), vrátí se zpět jen jeden závazek, který chcete. ..
Kroky na obrázku níže vytvářím podrobněji pro vás, včetně všech kroků, které se mohou stát ve skutečných situacích a spáchání kódu:
|
Jak vrátit poslední potvrzení Git?
Abychom vše obnovili zpět na způsob před posledním odevzdáním, musíme resetovat na odevzdání před HEAD.
Pokud si nechcete ponechat provedené změny:
git reset --hard HEAD ^
Pokud si chcete ponechat změny:
git reset --soft HEAD ^
Nyní zkontrolujte svůj git log. Ukáže, že náš poslední závazek byl odstraněn.
|
"Obnovit pracovní strom na poslední potvrzení"
git reset --hard HEAD ^
"Vyčistit neznámé soubory z pracovního stromu"
git čistý
viz - Git Quick Reference
POZNÁMKA: Tento příkaz odstraní předchozí potvrzení, proto jej používejte opatrně! git reset --hard je bezpečnější.
|
Použijte reflog k nalezení správného stavu
git reflog
PŘED RESETEM REFLOGUJTE
Vyberte správný reflog (v mém případě f3cb6e2) a zadejte
git reset --hard f3cb6e2
Poté bude repo HEAD resetováno na tento HEADid
PŘIHLÁSIT SE PO RESETU
Nakonec reflog vypadá jako na obrázku níže
REFLOG FINÁLNÍ
|
První běh:
git reflog
Ukáže vám všechny možné akce, které jste provedli ve svém úložišti, například potvrzení, sloučení, stažení atd.
Pak proveďte:
git reset --hard ActionIdFromRefLog
|
Vrátit poslední potvrzení:
git reset --soft HEAD ^ nebo git reset --soft HEAD ~
Tím se zruší poslední potvrzení.
Tady --soft znamená reset do fáze.
HEAD ~ nebo HEAD ^ znamená přesunout se dopustit před HEAD.
Nahradit poslední potvrzení novým potvrzením:
git commit --amend -m "zpráva"
Nahradí poslední potvrzení novým potvrzením.
|
Jiná cesta:
Podívejte se na větev, kterou chcete vrátit, a poté obnovte místní pracovní kopii zpět na potvrzení, že chcete být nejnovější na vzdáleném serveru (vše poté, co se rozloučí). K tomu jsem v SourceTree kliknul pravým tlačítkem na a zvolil „Obnovit BRANCHNAME na toto potvrzení“.
Poté přejděte do místního adresáře úložiště a spusťte tento příkaz:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAMEBRANCHNAME: BRANCHNAME
To vymaže všechny závazky po aktuálním ve vašem místním úložišti, ale pouze pro tuto jednu větev.
|
Zadejte git log, najděte poslední hash kód a poté zadejte:
git reset 
|
V mém případě jsem omylem spáchal nějaké soubory, které jsem nechtěl. Udělal jsem tedy následující a fungovalo to:
git reset --soft HEAD ^
git rm --cached [soubory, které nepotřebujete]
git přidat [soubory, které potřebujete]
git commit -c ORIG_HEAD
Výsledky ověřte pomocí gitk nebo git log --stat
|
Jednoduché, spusťte to na příkazovém řádku:
git reset --soft HEAD ~
|
Existují dva hlavní scénáře
Zatím jste nevytlačili potvrzení
Pokud problémem byly další soubory, které jste spáchali (a nechcete, aby byly v úložišti), můžete je odstranit pomocí git rm a poté potvrdit pomocí --amend
git rm 
Můžete také odstranit celé adresáře pomocí -r nebo dokonce kombinovat s jinými příkazy Bash
git rm -r 
git rm $ (najít -name '* .class')
Po odebrání souborů můžete provést potvrzení pomocí možnosti --amend
git commit --amend -C HEAD # Možnost -C je použít stejnou zprávu potvrzení
Tím se přepíše váš nedávný lokální odevzdání odebrání nadbytečných souborů, takže tyto soubory nebudou nikdy odeslány na push a také budou odstraněny z vašeho místního úložiště .git GC.
Již jste stiskli potvrzení
Můžete použít stejné řešení z druhého scénáře a poté provést git push s volbou -f, ale nedoporučuje se to, protože přepíše vzdálenou historii s odlišnou změnou (může poškodit vaše úložiště).
Místo toho musíte provést potvrzení bez --amend (pamatujte na toto o -amend`: Tato možnost přepíše historii posledního potvrzení).
|
Pro místní potvrzení
git reset --soft HEAD ~ 1
nebo pokud si nepamatujete přesně, ve kterém spáchání je, můžete použít
git rm --cached 
Za tlačené potvrzení
Správný způsob odstraňování souborů z historie úložiště je pomocí git filter-branch. To znamená
git filter-branch --index-filter 'git rm --cached ' HEAD
Ale doporučuji vám používat tento příkaz opatrně. Přečtěte si více na stránce git-filter-branch (1) Manual.
|
Chcete-li obnovit předchozí revizi, trvale smažete všechny nepotvrzené změny:
git reset --hard HEAD ~ 1
|
CO POUŽÍVAT, resetovat - soft nebo reset - hard?
Jen přidávám dva centy za odpověď @ Kyralessa:
Pokud si nejste jisti, co použít, přejděte na --soft (tuto konvenci jsem si zapamatoval --soft pro jistotu).
Proč?
Pokud se rozhodnete - tvrdě omylem, ZTRACÍTE své změny, jako tomu nebylo dříve.
Pokud omylem zvolíte --soft, můžete dosáhnout stejných výsledků --hard použitím dalších příkazů
git reset HEAD file.html
git checkout - file.html
Celý příklad
echo "některé změny ..."> file.html
git přidat soubor.html
git commit -m "špatné potvrzení"
# Musím resetovat
git reset --hard HEAD ~ 1 (zrušit změny)
# NEBO
git reset --soft HEAD ~ 1 # Zpět na pracovní verzi
git reset HEAD file.html # zpět do pracovního adresáře
git checkout - file.html # zrušit změny
Kredity jde do @Kyralessa.
|
1
2
3
další
Vysoce aktivní otázka. Získejte 10 reputace, abyste mohli odpovědět na tuto otázku. Požadavek na reputaci pomáhá chránit tuto otázku před spamem a neodpovědností.
Toto není odpověď, kterou hledáte? Přečtěte si další otázky týkající se značek git version-control git-commit undo nebo položte vlastní otázku.